home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / winlib.lzh / WINLIB / SCRSAVE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1994-07-09  |  7.6 KB  |  273 lines

  1. /********************************************************************
  2.  *                                                                    *
  3.  *    WinLIB PRO Revision II: Flying dialogs and screen copy routines    *
  4.  *    by Markus Gutschke and Ken Hollis                                *
  5.  *                                                                    *
  6.  *    Copyright (C) 1994, Bitgate Software                            *
  7.  *                                                                    *
  8.  ********************************************************************/
  9.  
  10. #include <stdlib.h>
  11. #include <stdarg.h>
  12. #include <string.h>
  13. #include "winlib.h"
  14.  
  15. void *bgbuffer;
  16.  
  17. /* check, if two rectangles intersect                                */
  18.  
  19. GLOBAL int intersect(int  x1,int  y1,int  w1,int  h1,
  20.                           int  x2,int  y2,int  w2,int  h2,
  21.                        int *x3,int *y3,int *w3,int *h3)
  22. {
  23.     *x3    = max(x1,x2);
  24.     *y3    = max(y1,y2);
  25.     *w3    = min(x1+w1-1,x2+w2-1) - *x3 + 1;
  26.     *h3    = min(y1+h1-1,y2+h2-1) - *y3 + 1;
  27.     return ((*w3 > 0) && (*h3 > 0));
  28. }
  29.  
  30. GLOBAL void *scrmove(void *buffer,int nx,int ny)
  31. {
  32.     #define    buffer    ((Buffer *)buffer)
  33.     Buffer    *newbuffer;
  34.     int        w,h;
  35.     int        rx,ry,rw,rh;
  36.     int        pxy[8],rst[8];
  37.  
  38.     if (buffer != 0 && buffer->magic == 0x4711) {
  39.         graf_mouse(M_OFF,0);
  40.         w = buffer->pxy[2]-buffer->pxy[0]+1;
  41.         h = buffer->pxy[3]-buffer->pxy[1]+1;
  42.         newbuffer = scrsave(buffer->vdihandle,nx,ny,w,h);
  43.         if (newbuffer == 0) {
  44.             form_dial(FMD_FINISH,0,0,0,0,nx,ny,w,h);
  45.             scrrestore(buffer);
  46.             return(0); }
  47.         buffer->magic = 0;
  48.         pxy[0] = buffer->pxy[0];
  49.         pxy[1] = buffer->pxy[1];
  50.         pxy[2] = buffer->pxy[2];
  51.         pxy[3] = buffer->pxy[3];
  52.         pxy[6] = (pxy[4] = nx) + w - 1;
  53.         pxy[7] = (pxy[5] = ny) + h - 1;
  54.         if (intersect(pxy[0],pxy[1],w,h,
  55.                       pxy[4],pxy[5],w,h,
  56.                       &rx,&ry,&rw,&rh)) {
  57.             rst[2] = (rst[0] = rx - pxy[0]) + rw - 1;
  58.             rst[3] = (rst[1] = ry - pxy[1]) + rh - 1;
  59.             rst[6] = (rst[4] = rx - nx) + rw - 1;
  60.             rst[7] = (rst[5] = ry - ny) + rh - 1;
  61.             vro_cpyfm(buffer->vdihandle,S_ONLY,rst,
  62.                       &buffer->mfdb,&newbuffer->mfdb); }
  63.         vro_cpyfm(buffer->vdihandle,S_ONLY,pxy,&buffer->scr,&buffer->scr);
  64.         if (intersect(pxy[0],pxy[1],w,h,
  65.                       pxy[0],pxy[1],pxy[6]-pxy[0]+1,pxy[5]-pxy[1],
  66.                       &rx,&ry,&rw,&rh)) {
  67.             rst[2] = (rst[0] = rx - pxy[0]) + rw - 1;
  68.             rst[3] = (rst[1] = ry - pxy[1]) + rh - 1;
  69.             rst[6] = (rst[4] = rx) + rw - 1;
  70.             rst[7] = (rst[5] = ry) + rh - 1;
  71.             vro_cpyfm(buffer->vdihandle,S_ONLY,rst,&buffer->mfdb,&buffer->scr); }
  72.         if (intersect(pxy[0],pxy[1],w,h,
  73.                       pxy[6]+1,pxy[1],pxy[2]-pxy[6],pxy[7]-pxy[1]+1,
  74.                       &rx,&ry,&rw,&rh)) {
  75.             rst[2] = (rst[0] = rx - pxy[0]) + rw - 1;
  76.             rst[3] = (rst[1] = ry - pxy[1]) + rh - 1;
  77.             rst[6] = (rst[4] = rx) + rw - 1;
  78.             rst[7] = (rst[5] = ry) + rh - 1;
  79.             vro_cpyfm(buffer->vdihandle,S_ONLY,rst,&buffer->mfdb,&buffer->scr); }
  80.         if (intersect(pxy[0],pxy[1],w,h,
  81.                       pxy[4],pxy[7]+1,pxy[2]-pxy[4]+1,pxy[3]-pxy[7],
  82.                       &rx,&ry,&rw,&rh)) {
  83.             rst[2] = (rst[0] = rx - pxy[0]) + rw - 1;
  84.             rst[3] = (rst[1] = ry - pxy[1]) + rh - 1;
  85.             rst[6] = (rst[4] = rx) + rw - 1;
  86.             rst[7] = (rst[5] = ry) + rh - 1;
  87.             vro_cpyfm(buffer->vdihandle,S_ONLY,rst,&buffer->mfdb,&buffer->scr); }
  88.         if (intersect(pxy[0],pxy[1],w,h,
  89.                       pxy[0],pxy[5],pxy[4]-pxy[0],pxy[3]-pxy[5]+1,
  90.                       &rx,&ry,&rw,&rh)) {
  91.             rst[2] = (rst[0] = rx - pxy[0]) + rw - 1;
  92.             rst[3] = (rst[1] = ry - pxy[1]) + rh - 1;
  93.             rst[6] = (rst[4] = rx) + rw - 1;
  94.             rst[7] = (rst[5] = ry) + rh - 1;
  95.             vro_cpyfm(buffer->vdihandle,S_ONLY,rst,&buffer->mfdb,&buffer->scr); }
  96.         graf_mouse(M_ON,0);
  97.         free(buffer);
  98.         return(newbuffer); }
  99.     return(0);
  100.     
  101.     #undef    buffer
  102. }
  103.  
  104. /* save screen rectangle and return handle                            */
  105.  
  106. GLOBAL void *scrsave(int vdihandle,int x,int y,int w,int h)
  107. {
  108.     int        workout[57];
  109.     Buffer    *buffer;
  110.     long    size;
  111.     int        planes,wdwidth;
  112.  
  113.     vq_extnd(vdihandle,1,workout);
  114.     planes = workout[4];
  115.     wdwidth = (int)((w + 15) / 16);
  116.     size = sizeof(Buffer) + (long)planes*(long)h*2L*(long)wdwidth;
  117.     if ((buffer = malloc(size)) == 0)
  118.         return(0);
  119.     else {
  120.         buffer->magic = 0x4711;
  121.         buffer->vdihandle        = vdihandle;
  122.         buffer->mfdb.fd_addr     = (long)&buffer->data;
  123.         buffer->mfdb.fd_w        = w;
  124.         buffer->mfdb.fd_h        = h;
  125.         buffer->mfdb.fd_wdwidth    = wdwidth;
  126.         buffer->mfdb.fd_stand    = 0;
  127.         buffer->mfdb.fd_nplanes    = planes;
  128.         buffer->scr.fd_addr        = (long)(0L);
  129.         buffer->scr.fd_w        = 
  130.         buffer->scr.fd_h        = 
  131.         buffer->scr.fd_wdwidth    = 
  132.         buffer->scr.fd_stand    =
  133.         buffer->scr.fd_nplanes    = 0;
  134.         buffer->pxy[0]            = x;
  135.         buffer->pxy[1]            = y;
  136.         buffer->pxy[2]            = x + w - 1;
  137.         buffer->pxy[3]            = y + h - 1;
  138.         buffer->pxy[4]             = 0;
  139.         buffer->pxy[5]             = 0;
  140.         buffer->pxy[6]             = w-1;
  141.         buffer->pxy[7]             = h-1;
  142.         graf_mouse(M_OFF,0);
  143.         vro_cpyfm(vdihandle,S_ONLY,buffer->pxy,
  144.                   &buffer->scr,&buffer->mfdb);
  145.         graf_mouse(M_ON,0);
  146.         return(buffer); }
  147. }
  148.  
  149. /* restore saved screen rectangle                                    */
  150.  
  151. GLOBAL void scrrestore(void *buffer)
  152. {
  153.     #define    buffer    ((Buffer *)buffer)
  154.     int        pxy[8];
  155.     int        *s,*d;
  156.  
  157.     if (buffer != 0 && buffer->magic == 0x4711) {
  158.         buffer->magic = 0;
  159.         d = pxy; s = buffer->pxy+4;
  160.         *d++ = *s++; *d++ = *s++; *d++ = *s++; *d++ = *s++;
  161.         d = pxy+4; s = buffer->pxy;
  162.         *d++ = *s++; *d++ = *s++; *d++ = *s++; *d++ = *s++;
  163.         graf_mouse(M_OFF,0);
  164.         vro_cpyfm(buffer->vdihandle,S_ONLY,pxy,
  165.                   &buffer->mfdb,&buffer->scr);
  166.         graf_mouse(M_ON,0);
  167.         free(buffer); }
  168.     return;
  169.     
  170.     #undef    buffer
  171. }
  172.  
  173. GLOBAL void showdialog(OBJECT *tree)
  174. {
  175.     int x,y,w,h;
  176.  
  177.     form_center(tree,&x,&y,&w,&h);
  178.  
  179.     bgbuffer = scrsave(VDIhandle,x,y,w,h);
  180.  
  181.     form_dial(FMD_GROW,0,0,0,0,x,y,w,h);
  182.     objc_draw(tree,0,8,x,y,w,h);
  183. }
  184.  
  185. GLOBAL void enddialog(OBJECT *tree)
  186. {
  187.     scrrestore(bgbuffer);
  188.     form_dial(FMD_SHRINK,0,0,0,0,tree->ob_x,tree->ob_y,tree->ob_width,tree->ob_height);
  189. }
  190.  
  191. GLOBAL BOOL WCanFly(void)
  192. {
  193.     if (find_cookie('NVDI'))
  194.         return TRUE;
  195.  
  196.     return FALSE;
  197. }
  198.  
  199. GLOBAL int dodialog(int vdihandle,OBJECT *tree,int skeleton,int outside)
  200. {
  201.     int        x,y,w,h,rc;
  202.     int        offx,offy;
  203.     int        wx,wy,ww,wh;
  204.     int        posx,posy,mx,my,mb,mk,ex = FALSE;
  205.  
  206.     wind_update(BEG_UPDATE);
  207.     wind_update(BEG_MCTRL);
  208.     wind_get(0,WF_WORKXYWH,&wx,&wy,&ww,&wh);
  209.  
  210.     x = tree->ob_x;
  211.     y = tree->ob_y;
  212.     w = tree->ob_width;
  213.     h = tree->ob_height;
  214.  
  215.     if ((tree->ob_state & OUTLINED) &&
  216.         !(tree->ob_flags & 0x600)) {
  217.         x -= 2;    w += 4;
  218.         y -= 2;    h += 4;
  219.     }
  220.     offx = x - tree->ob_x;
  221.     offy = y - tree->ob_y;
  222.  
  223.     do {
  224.         rc = form_do(tree,0) & 0x7FFF;
  225.         if (bgbuffer) {
  226.             if (tree[rc].ob_flags & TOUCHEXIT) {
  227.                 if ((tree[rc].ob_type >> 8) == FLYING) {
  228.                     WGrafMouse(FLAT_HAND);
  229.                     if ((skeleton) || !(WCheckSpeedup())) {
  230. /*                        scrrestore(bgbuffer); */
  231.                         graf_dragbox(w,h,x,y,wx,wy,ww,wh,&x,&y);
  232.                         tree->ob_x = x - offx;
  233.                         tree->ob_y = y - offy;
  234.                         bgbuffer = scrmove(bgbuffer,tree->ob_x,tree->ob_y);
  235. /*                        bgbuffer = scrsave(vdihandle,x,y,w,h);
  236.                         objc_draw(tree,0,8,x,y,w,h); */
  237.                     } else {
  238.                         int oldx, oldy;
  239.  
  240.                         graf_mkstate(&mx,&my,&mb,&mk);
  241.                         posx = x - mx;
  242.                         posy = y - my;
  243.                         while (mb) {
  244.                             graf_mkstate(&mx, &my, &mb, &mk);
  245.                             oldx = x;
  246.                             oldy = y;
  247.                             x = mx + posx;
  248.                             y = my + posy;
  249.                             if (x + w > wx + ww) x = wx + ww - w;
  250.                             if (x < wx) x = wx;
  251.                             if (y + h > wy + wh) y = wy + wh - h;
  252.                             if (y < wy) y = wy;
  253.                             tree->ob_x = x;
  254.                             tree->ob_y = y;
  255.                             if ((oldx!=x) || (oldy!=y))
  256.                                 bgbuffer = scrmove(bgbuffer,x,y);
  257.                         }
  258.                     }
  259.                 }
  260.             }
  261.  
  262.             if ((tree[rc].ob_flags & (EXIT | TOUCHEXIT)) &&
  263.                 ((tree[rc].ob_type >> 8)!=FLYING) &&
  264.                 (!(tree[rc].ob_state & DISABLED)))
  265.                 ex = TRUE;
  266.         }
  267.         WGrafMouse(ARROW);
  268.     } while (!ex);
  269.     objc_change(tree,rc,0,x,y,w,h,tree[rc].ob_state & ~SELECTED,1);
  270.  
  271.     wind_update(END_MCTRL);
  272.     wind_update(END_UPDATE);
  273.     return(rc);
  274. }